package com.ljl.question2;

import java.lang.reflect.Field;
import java.util.Map;

/**
 * 反射工具
 *
 * @author ljl
 */
public class ReflectUtil {
    /**
     * 通过反射创建对象，并传入属性的值
     *
     * @param className 全限定类名
     * @param configMap 属性
     * @return 对象
     * @throws Exception /
     */
    public static Object createObject(String className, Map<String, Object> configMap) throws Exception {
        Class<?> clazz = Class.forName(className);
        Object obj = clazz.getDeclaredConstructor().newInstance();
        // 设置属性值
        updateProperties(obj, configMap);
        return obj;
    }

    /**
     * 更新对象的属性值
     *
     * @param obj 对象
     * @param configMap 属性
     * @throws Exception /
     */
    public static void updateProperties(Object obj, Map<String, Object> configMap) throws Exception {
        Class<?> clazz = obj.getClass();
        // 遍历对象的属性，设置属性值
        for (Field field : clazz.getDeclaredFields()) {
            if (configMap.containsKey(field.getName())) {
                // 属性是否可设置
                if (field.canAccess(obj)) {
                    field.set(obj, configMap.get(field.getName()));
                } else {
                    try {
                        field.setAccessible(true);
                        field.set(obj, configMap.get(field.getName()));
                    } finally {
                        field.setAccessible(false);
                    }
                }
            }
        }
    }
}